//进行axios的全局配置（拦截器配置）
import axios from 'axios'
import store from '../store'
import ErrorCodeMessage from './errorCode'
import ErrprCodeMessage400 from './errorCode400'
import router from '../router'
//单独导入ElementUI 提示组件
import { Message } from 'element-ui'

//项目接口根地址
const BASE_API = '/admin';

//默认配置参数
const defaultOptions = {
   baseURL: BASE_API
}

//创建axios实例
const instance = axios.create(defaultOptions);

//统一携带token令牌
// instance.defaults.headers['Authorization'] = store.state.user.info['access_token'];

// console.log('初始化时的token:',store.state.user.info['access_token']);
//配置请求拦截器 - 负责处理请求发起之前的业务
instance.interceptors.request.use(config => {
   // console.log(config,store);
   if (store.state.user.info['access_token']) {//有token就携带
      config.headers['Authorization'] = store.state.user.info['access_token'];
   }
   return config;
}, error => {
   console.log(error);
})

//配置响应拦截器 - 负责处理请求结束，具体业务实现之前的业务逻辑
instance.interceptors.response.use(res => {
   // console.log(res);
   return res;
}, err => {
   console.log(err.response.data);
   // return err
   //统一处理失败业务
   let errorTip = '网络请求失败！';
   //针对于token失效 ，过期，异常的情况 ，需要直接退出并且清空当前登录用户信息（后期还可以根据如果是token过期，可以重新获取新的这样用户体验好一些）
   let specialCode = [100065, 100043, 100044 ,10002];//特殊错误码

   switch (err.response.status) {
      case 401:
         var errorCode = err.response.data.errorCode;//获取后台返回的错误码
         errorTip = ErrorCodeMessage[errorCode];
         //处理特殊的错误（token失效 ，过期，异常的情况）
         if (specialCode.includes(errorCode)) {
            // console.log('需要执行特殊处理');
            //1.情况当前用户的数据
            console.log(router);
            let redirectUrl = router.currentRoute.fullPath || '/';//获取当前路由的地址
            store.dispatch('user/logout').then(() => {
            //2.跳转回到登录页
               router.push({
                  path: '/login',
                  query: {
                     redirect: redirectUrl
                  }
               });
            })

         }
         break;
      case 400:
         errorCode = err.response.data.errorCode;//获取错误码
         errorTip = ErrprCodeMessage400[errorCode] || errorTip;
         break;   
      case 403:
         break;
   }

   Message({
      type: 'error',
      message: errorTip
   })

   // return err;
})

export default instance;